package 螺旋矩阵II.螺旋遍历二维数组;

import java.util.Arrays;

public class spiralArray {
    public static void main(String[] args) {

        /*

        给定一个二维数组 array，请返回「螺旋遍历」该数组的结果

        螺旋遍历：从左上角开始，按照 向右、向下、向左、向上 的顺序 依次 提取元素，然后再进入内部一层重复相同的步骤，直到提取完所有元素

         */

        int[][] arr = {
                {1,2,3},
                {8,9,4},
                {7,6,5}
        };
        int[] result = spiralArray1(arr);
        System.out.println(Arrays.toString(result));


    }


    public static int[] spiralArray1(int[][] array) {
        // 记录数组的行开始，行结束，列开始，列结束的地方
        // 每从左到右遍历一行就将行开始的标识进行加一操作
        // 每从上到下遍历一列就将列结束的标识进行减一操作
        // 每从右到左遍历一行就将行结束的标识进行减一操作
        // 每从下到上遍历一列就将列开始的标识进行加一操作
        // 知道 行开始的标识>行结束的标识 或者 列开始的标识>列结束的标识

        if ( array.length == 0 )
            return new int[0];

        int[] resArr = new int[array.length * array[0].length];

        // 行开始的标识
        int rowBegin = 0;
        // 行结束的标识
        int rowEnd = array.length - 1;
        // 列开始的标识
        int cloBegin = 0;
        // 列结束的标识
        int cloEnd = array[0].length - 1;
        // 记录数组结果当前写入的位置
        int count = 0;

        while ( rowBegin <= rowEnd && cloBegin <= cloEnd ){
            // 从左到右遍历一行(rowBegin)
            for (int i = cloBegin; i <= cloEnd; i++)
                resArr[count++] = array[rowBegin][i];
            rowBegin++;

            // 从上到下遍历一列(cloEnd)
            for (int i = rowBegin; i <= rowEnd; i++)
                resArr[count++] = array[i][cloEnd];
            cloEnd--;

            // 需要判断所有行是否已经遍历结束，防止指针越界
            if ( rowBegin > rowEnd )
                break;

            // 从右到左遍历一行(rowEnd)
            for (int i = cloEnd; i >= cloBegin; i--)
                resArr[count++] = array[rowEnd][i];
            rowEnd--;

            // 需要判断所有列是否已经遍历结束，防止指针越界
            if ( cloBegin > cloEnd )
                break;

            // 从下到上遍历一列(cloBegin)
            for (int i = rowEnd; i >= rowBegin; i--)
                resArr[count++] = array[i][cloBegin];
            cloBegin++;
        }
        return resArr;
    }

}
